package sge.DAO;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import static sge.DAO.ObjetoDAO.CONEXION;
import sge.Datos.ModeloTabla;
import sge.Entidades.*;

public class UsuarioDAO implements ObjetoDAO {

    private final static Logger LOG = Logger.getLogger(UsuarioDAO.class.getName());

    public UsuarioDAO() {
    }

    public boolean crear(Entidad entidad) {
        Usuario usuario;
        try {
            usuario = (Usuario) entidad;
        } catch (Exception ex) {
            LOG.log(Level.SEVERE, "Falló el casting del objeto Entidad: ", ex);
            return false;
        }
        String consulta = "INSERT INTO usuario(id_usuario, documento, "
                + "clave, nombre, apellido, direccion, telefono, tipo, "
                + "cargo, estado) VALUES(NULL, '"
                + usuario.getDocumento() + "', '"
                + usuario.getClave() + "', '"
                + usuario.getNombre() + "', '"
                + usuario.getApellido() + "', '"
                + usuario.getDireccion() + "', '"
                + usuario.getTelefono() + "', '"
                + usuario.getTipo() + "', '"
                + usuario.getCargo() + "', '"
                + usuario.getEstado() + "');";

        boolean exito = CONEXION.ejecutarSQL(consulta) > 0;
        if (exito) {
            usuario.setIdUsuario(CONEXION.obtenerUltimoIDGenerado());
        }
        return exito;
    }

    public boolean modificar(Usuario usuario) {

            String consulta = "UPDATE usuario SET "
                    + "documento='" + usuario.getDocumento()
                    + "', clave='" + usuario.getClave()
                    + "', nombre='" + usuario.getNombre()
                    + "', apellido='" + usuario.getApellido()
                    + "', direccion='" + usuario.getDireccion()
                    + "', telefono='" + usuario.getTelefono()
                    + "', tipo='" + usuario.getTipo()
                    + "', cargo='" + usuario.getCargo()
                    + "' WHERE "
                    + "id_usuario='" + usuario.getIdUsuario() + "';";

            boolean exito = CONEXION.ejecutarSQL(consulta) > 0;
            return exito;
    }

    public boolean eliminar(Integer idUsuario, int e) {
        String consulta = "UPDATE usuario SET estado = '" + e + "' WHERE id_usuario='" + idUsuario + "';";
        return CONEXION.ejecutarSQL(consulta) > 0;

    }

    public boolean consultar(Usuario usuario) {
        boolean login = false;
        String consulta = "SELECT * FROM usuario WHERE estado = 1 ";

        if (usuario.getIdUsuario() != null) {
            consulta += " AND id_usuario = ?";
        } else if (usuario.getDocumento() != null && usuario.getClave() != null) {
            login = true;
            consulta += " AND documento = ? && clave = ?";
        } else {
            return false;
        }

        PreparedStatement ps = CONEXION.crearSentenciaPreparada(consulta);

        try {

            if (!login) {
                ps.setInt(1, usuario.getIdUsuario());
            } else {
                ps.setString(1, usuario.getDocumento());
                ps.setString(2, usuario.getClave());
            }

            ResultSet rs = ps.executeQuery();

            if (rs.next()) {
                usuario.setIdUsuario(rs.getInt(1));
                usuario.setClave(rs.getString(2));
                usuario.setDocumento(rs.getString(3));
                usuario.setNombre(rs.getString(4));
                usuario.setApellido(rs.getString(5));
                usuario.setDireccion(rs.getString(6));
                usuario.setTelefono(rs.getString(7));
                usuario.setTipo(rs.getString(8));
                usuario.setCargo(rs.getString(9));
                usuario.setEstado(rs.getString(10));
                return true;
            } else {
                return false;
            }

        } catch (SQLException ex) {
            LOG.log(Level.SEVERE, null, ex);
        }
        return false;
    }

    public ModeloTabla seleccionar() {
        String consulta = "SELECT * FROM usuario";
        ArrayList<String> cols = new ArrayList<>();

        cols.add("Id Usuario");
        cols.add("Documento");
        cols.add("Clave");
        cols.add("Nombre");
        cols.add("Apellido");
        cols.add("Dirección");
        cols.add("Telefono");
        cols.add("Tipo");
        cols.add("Cargo");
        cols.add("Estado");

        ModeloTabla modelo = new ModeloTabla(consulta, cols, false);

        return modelo;

    }
}
